package com.geely.jdemo.genericmethod;

import androidx.annotation.NonNull;

import org.junit.Test;

public class GenericMethod2 {
    static class Fruit {
        @NonNull
        @Override
        public String toString() {
            return "fruit";
        }
    }

    class Apple extends Fruit {
        @NonNull
        @Override
        public String toString() {
            return "apple";
        }
    }

    class Person {
        @NonNull
        @Override
        public String toString() {
            return "person";
        }
    }


    static class GenericTest<T> {
        public void show_1(T t) {
            System.out.println(t.toString());
        }

        //在泛型类中声明一个泛型方法，使用泛型T
        //这个T是全新的泛型类型，可以与泛型类中声明的T不是同一类型
        public <T> void show_2(T t) {
            System.out.println(t.toString());
        }

        //在泛型类中声明一个泛型方法，使用泛型E,这种泛型E可以为任意类型
        //类型可以与T相同，也可不同
        //由于泛型方法在声明泛型的时候会声明泛型<E>,因此即使在泛型类中未声明泛型，编译器也能够识别泛型方法中的泛型
        public <E> void show_3(E e) {
            System.out.println(e.toString());
        }
    }

    @Test
    public void mainTest() {
        Apple apple = new Apple();
        Person person = new Person();
        GenericTest<Fruit> fruitGenericTest = new GenericTest<>();
        fruitGenericTest.show_1(apple);
//        fruitGenericTest.show_1(person);

        fruitGenericTest.show_2(apple);
        fruitGenericTest.show_2(person);

        fruitGenericTest.show_3(apple);
        fruitGenericTest.show_3(person);
    }
}
